package com.cn.tous.auth.oauth2.token;

import com.cn.tous.auth.dtos.AuthUser;
import org.springframework.security.core.Authentication;
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenCustomizer;

/**
 *  添加额外的 claims
 */
public class JwtTokenJwtCustomizer implements OAuth2TokenCustomizer<JwtEncodingContext> {
    @Override
    public void customize(JwtEncodingContext context) {
        // 只对 Access Token 进行自定义
        if (context.getTokenType().equals(OAuth2TokenType.ACCESS_TOKEN)) {
            // 获取当前认证的主体
            Authentication principal = context.getPrincipal();

            // 你可以从 Authentication 中提取你需要的信息
            // 例如，假设你的 UserDetailsService 返回的是 UserDetails 实现类
            if (principal.getPrincipal() instanceof AuthUser userDetails) {
                // 添加自定义 claims
                context.getClaims().claim("user_id", userDetails.getId());
                context.getClaims().claim("nick_name", userDetails.getNickname());
                context.getClaims().claim("roles", userDetails.getRoles());

            }

//            // 你也可以根据客户端、授权类型等信息添加不同的 claims
//            RegisteredClient registeredClient = context.getRegisteredClient();
//            context.getClaims().claim("client_name", registeredClient.getClientName());
//
//            // 示例：根据授权类型添加不同信息
//            if (context.getAuthorizationGrantType().equals(AuthorizationGrantType.PASSWORD)) {
//                context.getClaims().claim("token_origin", "password_grant");
//            }
        }
    }
}
